1. /* sdfdsins.cpp by K.Tsuru */
  2. // function ID 3210 DRADIX
  3. /****************************************************
  4. SDouble class
  5. It provides the function sin x by series |x| < 1.0.
  6. *****************************************************/
  7. #ifndef SN_H
  8. #include "sn.h"
  9. #endif
  10. static const char* func = "SinSeries";
  11. SDouble SinSeries(const SDouble& x){
  12. // if(x.Sign(3210) == 0 ) return 0.0;//It does not check x==0 or not.
  13. SDouble sum(x), xsq(x*x), delta;
  14. ulong n = 4, den, mt = x.SlOpMaxValue();
  15. // check |x| < 1.0.
  16. if(x.NetRdxExp() > 1) sum.SetError(sum.OUT_OF_RANGE, func, 3210);
  17. sum.FixedPoint(x.RdxExp());
  18. delta = DsDiv(x*xsq, 6); //(x^3)/6
  19. sum -= delta;
  20. while(delta.Sign(3210)){// n(n+1) < x.SlOpMaxValue()
  21. den = n*(n+1); //The value of "den" does not discontinuously exceed ULONG_MAX.
  22. if(den >= mt) break;
  23. delta *= xsq;
  24. delta = DsDiv(delta, den);
  25. if(n & 2) sum -= delta;
  26. else sum += delta;
  27. n += 2;
  28. }
  29. while(delta.Sign(3210)){// n(n+1) >= x.SlOpMaxValue();
  30. if(n >= mt){
  31. sum.SetError(sum.NOT_CONVERGE, func, -3210); break;
  32. }
  33. delta *= xsq;
  34. delta = DsDiv(delta, n);
  35. delta = DsDiv(delta, n+1);
  36. if(n & 2) sum -= delta;
  37. else sum += delta;
  38. n += 2;
  39. }
  40. sum.PointFree();
  41. sum.Reform(3210);
  42. sum.upToTerm = n/2;
  43. return sum;
  44. }

sdfdsins.cpp : last modifiled at 2017/09/07 15:06:25(1,322 bytes)
created at 2017/10/07 10:22:50
The creation time of this html file is 2017/10/07 11:29:39 (Sat Oct 07 11:29:39 2017).